查看原文
其他

ClickHouse与开源的Amazon S3对象存储

alitrack alitrack 2022-11-12

什么是 Amazon S3

Amazon Simple Storage Service (Amazon S3[1]) 是一种对象存储服务,提供行业领先的可扩展性、数据可用性、安全性和性能。这意味着各种规模和行业的客户都可以使用 S3 来存储并保护各种用例(如数据湖、网站、移动应用程序、备份和还原、存档、企业应用程序、IoT 设备和大数据分析)的数据,容量不限。Amazon S3 提供了易于使用的管理功能,因此您可以组织数据并配置精细调整过的使用权限控制,从而满足特定的业务、组织和合规性要求。Amazon S3 可达到 99.999999999%(11 个 9)的持久性,并为全球各地的公司存储数百万个应用程序的数据。

另外什么是 Lakehouse(湖仓一体)里提到,

虽然分布式文件系统可以用于存储层,但对象存储更常用在 Lakehouse 中。对象存储提供低成本、高可用性的存储,适合大规模并行读取——这是现代数据仓库的基本要求。

Amazon S3 开源方案

Amazon S3 是亚马逊最早推出的云服务之一,经过多年的发展,S3 协议对象存储行业事实上已经成为标准,既然已经作为标准,肯定少不了开源实现,即使没有注册亚马逊云服务,一样可以体验 S3,如今天用安装(甚至可以不用安装)简单便捷的 MiniO Server 来体验下 S3。

MinIO[2] 是一个基于 Apache License v2.0 开源协议的对象存储服务。它兼容亚马逊 S3 云存储服务接口,非常适合于存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等,而一个对象文件可以是任意大小,从几 kb 到最大 5T 不等。

它的服务端只有一个文件,minio,客户端也只有一个文件,mc。

官网提供了多种安装运行方式,最简单的莫过于直接下载运行。这里就不展开介绍 MinIO 的强大了

服务端

$ wget https://dl.min.io/server/minio/release/darwin-amd64/minio
$ chmod +x minio
$ ./minio server /data

我测试用的命令是,

 $ MINIO_ROOT_USER=minio MINIO_ROOT_PASSWORD=miniostorage minio server  --address=:9000  /Users/steven/data/s3
Endpoint: http://192.168.25.144:9000  http://192.168.64.1:9000  http://127.0.0.1:9000
RootUser: minio
RootPass: miniostorage

Browser Access:
   http://192.168.25.144:9000  http://192.168.64.1:9000  http://127.0.0.1:9000

Command-line Access: https://docs.min.io/docs/minio-client-quickstart-guide
   $ mc alias set myminio http://192.168.25.144:9000 minio miniostorage

Object API (Amazon S3 compatible):
   Go:         https://docs.min.io/docs/golang-client-quickstart-guide
   Java:       https://docs.min.io/docs/java-client-quickstart-guide
   Python:     https://docs.min.io/docs/python-client-quickstart-guide
   JavaScript: https://docs.min.io/docs/javascript-client-quickstart-guide
   .NET:       https://docs.min.io/docs/dotnet-client-quickstart-guide
IAM initialization complete


服务起来后,浏览器访问http://127.0.0.1:9000,使用用户名(minio)和密码(miniostorage)登录后可以看到类似这样的页面(我截图的时候已经建了两个bucket,并推送了文件),

客户端

$ wget https://dl.min.io/client/mc/release/linux-amd64/mc
$ chmod +x mc
$ ./mc --help

为了能访问刚起的 MinIO 服务, 按 Server 端提示执行,

#设置别名
$ mc alias set local http://192.168.25.144:9000 minio miniostorage
Added `myminio` successfully.

然后可以访问和操作 MinIO Server 了,

#创建 bucket, 名为iris
$ mc mb myminio/iris
# 从本地推送 iris.snappy.parquet 到bucket iris中
$ mc cp /Users/steven/data/iris/iris.snappy.parquet myminio/iris/
# 查看 bucket iris
$ mc ls myminio/iris

准备工作做好后,开始用 ClickHouse 访问 S3

ClickHouse 访问 S3

S3 Table Engine(S3 表引擎)

官方文档有误(也许因为版本太老的缘故)

正确的语法是,

ENGINE = S3(path, [aws_access_key_id, aws_secret_access_key,] format, [compression])

引擎参数

  • path—带有文件路径的存储桶 URL。只读模式支持通配符[3]如:*?{abc,def}{N..M}]。
  • format文件格式[4]
  • compression—压缩类型。支持的值:none,gzip / gz,brotli / br,xz / LZMA,zstd / zst。参数是可选的。默认情况下,它将通过文件扩展名自动检测压缩。

结合上面推送的 iris.snappy.parquet,一个完整的 Create Table 的例子,

 CREATE TABLE iris (
 Sepal_Length Float64
 ,Sepal_Width Float64
 ,Petal_Length Float64
 ,Petal_Width Float64
 ,Species String
 ) ENGINE = S3('http://192.168.25.144:9000/iris/*.parquet',
 'minio''miniostorage''Parquet','auto')

select from iris limit 5;
┌─Sepal_Length─┬─Sepal_Width─┬─Petal_Length─┬─Petal_Width─┬─Species─┐
│          5.1 │         3.5 │          1.4 │         0.2 │ setosa  │
│          4.9 │           3 │          1.4 │         0.2 │ setosa  │
│          4.7 │         3.2 │          1.3 │         0.2 │ setosa  │
│          4.6 │         3.1 │          1.5 │         0.2 │ setosa  │
│            5 │         3.6 │          1.4 │         0.2 │ setosa  │
└──────────────┴─────────────┴──────────────┴─────────────┴─────────┘

S3 Table Function(S3 表函数)

与 S3 表引擎相比,就是把 structure(表结构信息由 create table 移到了参数里),

 select * from s3('http://192.168.25.144:9000/iris_csv/iris.csv'
'minio''miniostorage''CSVWithNames'
,'`Sepal.Length` Float64,`Sepal.Width` Float64,`Petal.Length` Float64,`Petal.Width` Float64,Species String','none')
limit 3;

┌─Sepal.Length─┬─Sepal.Width─┬─Petal.Length─┬─Petal.Width─┬─Species─┐
│          5.1 │         3.5 │          1.4 │         0.2 │ setosa  │
│          4.9 │           3 │          1.4 │         0.2 │ setosa  │
│          4.7 │         3.2 │          1.3 │         0.2 │ setosa  │
└──────────────┴─────────────┴──────────────┴─────────────┴─────────┘

MinIO Play

如果你暂时不想安装 MinIO Server,可以试试免费的 MinIO Play,

MinIO Play 账户信息

"play": {
    "url""https://play.min.io",
    "accessKey""Q3AM3UQ867SPQQA43P2F",
    "secretKey""zuf+tfteSlswRu7BJ86wekitnifILbZam1KYY3TG",
    "api""S3v4",
    "path""auto"
}

创建一个 bucket

$ mc mb play/clickhouse

创建表

 CREATE TABLE s3_play (name Stringvalue UInt32)
ENGINE=S3('https://play.min.io/clickhouse/data.csv.gz'
,'Q3AM3UQ867SPQQA43P2F'
,'zuf+tfteSlswRu7BJ86wekitnifILbZam1KYY3TG''CSV''gzip')

插入数据

INSERT INTO s3_play VALUES ('one'1), ('two'2), ('three'3)

查询

  • S3 表引擎模式
select * from s3_play;
┌─name──┬─value─┐
│ one   │     1 │
│ two   │     2 │
│ three │     3 │
└───────┴───────┘
  • s3 表函数模式,
 select * from s3('https://play.min.io/clickhouse/data.csv.gz'
,'Q3AM3UQ867SPQQA43P2F'
,'zuf+tfteSlswRu7BJ86wekitnifILbZam1KYY3TG'
'CSV','name String, value UInt32'
'gzip');

┌─name──┬─value─┐
│ one   │     1 │
│ two   │     2 │
│ three │     3 │
└───────┴───────┘

删除数据

不支持

S3 做为 ClickHouse 数据的存储层

目前参照网上的资料还没有测试通过,待续。有兴趣的可以看看探索ClickHouse与Amazon S3结合使用的3种方法。

参考资料

[1]

Amazon S3: https://aws.amazon.com/cn/s3/

[2]

MinIO: https://min.io/

[3]

通配符: https://clickhouse.tech/docs/en/engines/table-engines/integrations/s3/#wildcards-in-path

[4]

文件格式: https://clickhouse.tech/docs/en/interfaces/formats/#formats


欢迎关注公众号

有兴趣加群讨论数据挖掘和分析的朋友可以加我微信(witwall),暗号:入群

也欢迎投稿!


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存